home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Floppyshop 2
/
Floppyshop - 2.zip
/
Floppyshop - 2.iso
/
diskmags
/
0022-3.564
/
dmg-3323
/
protocol.gem
/
68000
/
cookijar.s
< prev
next >
Wrap
Text File
|
1987-04-21
|
6KB
|
142 lines
*--------------------------------------------------------------------------*
* Fichier "COOKIJAR.S"
* Routine appelée en mode superviseur avec Xbios(38).
* Etant donné que dans le cas d'un tel appel il est quasiment
* impossible de passer des paramétres, cette routine les
* récupère dans COOKIE1, COOKIE2, COOKIE3
* COOKIE1 .L nom du cookie à chercher
* COOKIE2 .L adresse de la boite à gateaux que nous
* proposons au cas ou l'actuelle serait pleine. (0 si nous
* ne voulons pas remplacer la boite).
* COOKIE3 .L adresse à placer dans la boite, aprés le
* cookie1 s'il est trouvé. 0 pour juste regarder !
* COOKIE4 .W (0 ou 1) Si nous trouvons COOKIE1: si COOKIE4 vaut 1,
* il faut imposer COOKIE3 dans le long mot suivant COOKIE1.
* COOKIE2 contient l'adresse de la boite à gateaux, 0 si ne
* l'a pas trouvé ou que sa création est impossible.
* COOKIE3 contient le .L situé aprés le COOKIE1 ou 0 si nous n'avons
* rien trouvé.
COOKIE_JAR:
MOVE.L $5A0,A1 adresse systéme pour la boite
CMP.L #0,A1 il y a déja une boite ?
BNE.S BOITE_OK Oui
* Il n'y a pas de boite à gateaux, nous testons COOKIE2 pour
* savoir si nous devons en placer une.
TST.L COOKIE2
BNE.S .ICI
BRA END_COOKIE
* Il n'y a pas de boite, nous plaçons donc la notre. Par précaution
* notre boite posséde 16 emplacements (contre 8 pour la boite
* d'origine des STE et TT)
.ICI MOVE.L COOKIE2,D0
MOVE.L D0,$5A0
MOVE.L D0,A1 pour la suite
* Notre boite est vide, devons-nous y mettre quelque chose ?
TST.L COOKIE3
BEQ END_COOKIE non, donc bye bye
BRA FILL_COOKIE oui donc remplissons
* Nous avons trouvé une boite à gateaux (adr. en A1)
* Suivant COOKIE1, nous devons chercher un COOKIE ou non.
BOITE_OK TST.L COOKIE1 faut-il chercher un gateaux?
BEQ END_COOKIE non, donc bye bye
* Bouclons pour chercher si le COOKIE1 est dans la boite...
MOVEQ #0,D7 init le compteur de gateaux
MOVE.L COOKIE1,D2 valeur à chercher...
MIAM MOVE.L (A1)+,D0 Prends un gateaux
MOVE.L (A1)+,A0 puis un autre (gourmand!)
ADDQ.W #1,D7 compte un couple
TST.L D0 Emplacement vide?
BNE CMP_COOKIE non, donc comparons...
* Nous avons trouvé un gateaux vide!!!!! C'est sans doute la fin
* de la liste.... devons nous essayer de déposer dans la boite
* notre COOKIE ou bien dire simplement qu'on a pas trouvé COOKIE1 ?
* Cela dépend de la valeur de COOKIE3!
* ATTENTION, une précaution trés importante!!! Il est tout a fait
* possible qu'un programme ait fabriqué une boite, noté son
* emplacement en 5A0, puis soit parti! L'adresse de la boite
* est donc toujours en 5A0, mais à cette adresse il n'y a plus
* rien!!! On vérifie donc le nombre de slots, nombre qui doit
* étre dans A0!
CMP.L #0,A0 il y a des slots?
BNE .ICI oui, c'est ok...
* Cookie vide mais aussi nombre de slot nul, cela veut dire
* que l'adresse trouvée en 5A0 est mauvaise!
CLR.L $5A0
BRA COOKIE_JAR recommençons tout haut!!!
.ICI TST.L COOKIE3
BEQ END_COOKIE rien à déposer, donc bye bye...
* Nous n'avons pas trouvé notre COOKIE1, nous allons donc le
* placer dans la boite, en le faisant suivre par COOKIE3.
* Mais y-a-t il encore de la place dans la boite ?
MOVE.L A0,D0 nombre d'emplacement
CMP.L D0,D7 compare aux couples lus
* NOTE: le couple vide est compté comme 1. Si nous trouvons
* dans la boite mention de 8 slots, il n'y en a en fait
* que 7 pour les gateaux puisque le dernier (le huitième)
* indique la fin!
BEQ BIG_BOITE il faut faire une boite + grande!
* Reculons pour placer notre nom de cookie et l'adresse.
SUBA.L #8,A1
MOVE.L COOKIE1,(A1)+
MOVE.L COOKIE3,(A1)+
MOVE.L #0,(A1)+ indique fin de liste
MOVE.L D0,(A1)+ et nombre de slots
BRA END_COOKIE
* La boite est déja pleine! Nous allons donc
* créer une nouvelle boite, plus grande, transvaser le
* contenu de l'ancienne dans la nouvelle, et y déposer
* notre gateaux, bien confortablement (pas au frais, les gateaux
* n'aiment pas trop l'humidité).
* Nous avons prévu une nouvelle boite avec 16 emplacements.
* Si l'ancienne contenait déja au moins 16 couples, nous
* abandonnons, car nous n'aurons pas assez de place.
BIG_BOITE CMP.L #16,D0
BHS NO_BOX
TST.L COOKIE2 mettre une boite ?
BEQ NO_BOX
MOVE.L $5A0,A0 reprend départ de la boite
MOVE.L COOKIE2,A1 adr nouvelle boite
MOVE.L A1,$5A0 adr. systéme
* -2 pour D7 car nous allons travailler en DBF et en plus
* il ne faut pas recopier le slot vide.
SUBQ.W #2,D7
TST.W D7 précaution...
BPL .HOP c'est ok!
MOVE.L #0,COOKIE2 boite abimée!
BRA END_COOKIE
.HOP MOVE.L (A0)+,(A1)+
MOVE.L (A0)+,(A1)+
DBF D7,.HOP
* La recopie étant faites, plaçons COOKIE1 et COOKIE3
FILL_COOKIE
MOVE.L COOKIE1,(A1)+
MOVE.L COOKIE3,(A1)+
MOVE.L #0,(A1)+ le slot vide
MOVE.L #16,(A1)+ et le nombre total de slots
BRA END_COOKIE
NO_BOX MOVE.L #0,COOKIE3 raté, impossible de mettre notre cookie...
BRA END_COOKIE
* Nous avons trouvé un cookie dans la boite!
* Est-ce celui que nous cherchons ?
CMP_COOKIE CMP.L D0,D2 c'est notre gateaux ?
BNE MIAM non, bonne excuse pour en prendre d'autres...
* Nous avons trouvé le gateaux qui est indiqué dans COOKIE1!
* Devons nous simplement noter l'adresse qui suit ou bien
* forcer cette adresse avec la valeur de COOKIE3 ?
* Cela dépend de la valeur de COOKIE4!
TST.W COOKIE4 juste prendre l'adresse ?
BEQ .LA oui
* COOKIE4 valant 1, nous devons placer COOKIE3 dans la boite.
SUBA.L #4,A1 recule sur le bon endroit
MOVE.L COOKIE3,(A1)
BRA END_COOKIE et bye bye...
.LA MOVE.L A0,COOKIE3
END_COOKIE MOVE.L $5A0,COOKIE2
RTS
*--------------------------------------------------------------------------*